/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.clases;


import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;


/**
 * Clase que implementa el control del listado de viajes
 * @author David
 */
public class ControlaListado{

         private List<Hora> horas;
         private List<Reserva> reservas;
           
         /**
          * Constructor de la clase ControlaListado.
          * @param horas Lista de horas a las que hay trayectos.
          * @param reservas Lista de reservas registradas.
          */
         
        public ControlaListado (List<Hora> horas,List<Reserva> reservas ){
            this.horas = horas;
            this.reservas = reservas;
        }

    /**
         * Permite obtener la hora de inicio del viaje. No se mostrarán las
         * horas para las cuales ya no hay asientos disponibles
         * @param origen ciudad origen
         * @param destino ciudad destino
         * @param fecha fecha del viaje
         * @return un array con las horas de partida disponibles
         */
        public List<LocalTime> buscaViaje(String origen, String destino, LocalDate fecha){
            List<LocalTime> listado = new ArrayList<LocalTime> ();

            // Por cada hora mira si tiene un trayecto con esa ciudad de origen y destino, en caso afirmativo lo guarda.
            List<Hora> horitas = new ArrayList<Hora> ();
            for(Hora hora : this.horas){
                if(hora.obtieneTrayecto().existeTrayecto(new Ciudad(origen),new Ciudad(destino)) != false){
                    horitas.add(hora);
                }
            }
            if(horitas.isEmpty()){
                throw new RuntimeException("buscaViaje:No existe un trayecto entre las ciudadades dadas");
            }
            //Filtra obteniendo las horas disponibles
            // Va mirando cada hora con todas las reservas para ver si alguna le dice que
            // no está disponible.
            List<Hora> horasDisponibles = new ArrayList<Hora> ();
            
            for(Hora hora : horitas){
                boolean horaDisponible = true;
                
                for(Reserva reserva : this.reservas){
                    if(reserva.horaDisponible(fecha, hora) == false){
                        horaDisponible = false;
                    }
                }
                if(horaDisponible){
                    horasDisponibles.add(hora);
                }
            }
            if(horasDisponibles.isEmpty()){
                throw new RuntimeException("buscaViaje:No existen horas disponibles para el trayecto dado");
            }

            for(Hora hora : horasDisponibles){
                listado.add(hora.obtieneHoraSalida());
            }
            
            return listado;
        }
}
